{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from sklearn import datasets\n",
    "from tensorflow.python.framework import ops\n",
    "ops.reset_default_graph()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "iris = datasets.load_iris()\n",
    "x_vals = np.array([x[0:3] for x in iris.data])\n",
    "y_vals = np.array([x[3] for x in iris.data])\n",
    "sess = tf.Session()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "seed = 3\n",
    "tf.set_random_seed(seed)\n",
    "np.random.seed(seed)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "train_indices = np.random.choice(len(x_vals), round(len(x_vals)*0.8), replace=False)\n",
    "test_indices = np.array(list(set(range(len(x_vals))) - set(train_indices)))\n",
    "x_vals_train = x_vals[train_indices]\n",
    "x_vals_test = x_vals[test_indices]\n",
    "y_vals_train = y_vals[train_indices]\n",
    "y_vals_test = y_vals[test_indices]\n",
    "def normalize_cols(m):\n",
    "    col_max = m.max(axis=0)\n",
    "    col_min = m.min(axis=0)\n",
    "    return (m-col_min) / (col_max - col_min)\n",
    "x_vals_train = np.nan_to_num(normalize_cols(x_vals_train))\n",
    "x_vals_test = np.nan_to_num(normalize_cols(x_vals_test))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "batch_size = 50\n",
    "x_data = tf.placeholder(shape=[None, 3], dtype=tf.float32)\n",
    "y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "hidden_layer_nodes = 10\n",
    "A1 = tf.Variable(tf.random_normal(shape=[3,hidden_layer_nodes]))\n",
    "b1 = tf.Variable(tf.random_normal(shape=[hidden_layer_nodes]))\n",
    "A2 = tf.Variable(tf.random_normal(shape=[hidden_layer_nodes,1]))\n",
    "b2 = tf.Variable(tf.random_normal(shape=[1]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "hidden_output = tf.nn.relu(tf.add(tf.matmul(x_data, A1), b1))\n",
    "final_output = tf.nn.relu(tf.add(tf.matmul(hidden_output, A2), b2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "loss = tf.reduce_mean(tf.square(y_target - final_output))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "my_opt = tf.train.GradientDescentOptimizer(0.005)\n",
    "train_step = my_opt.minimize(loss)\n",
    "init = tf.global_variables_initializer()\n",
    "sess.run(init)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Generation: 50. Loss = 0.112982\n",
      "Generation: 100. Loss = 0.0784244\n",
      "Generation: 150. Loss = 0.0803005\n",
      "Generation: 200. Loss = 0.0675039\n",
      "Generation: 250. Loss = 0.0840416\n",
      "Generation: 300. Loss = 0.0661501\n",
      "Generation: 350. Loss = 0.0476385\n",
      "Generation: 400. Loss = 0.0914209\n",
      "Generation: 450. Loss = 0.0812059\n",
      "Generation: 500. Loss = 0.0842396\n"
     ]
    }
   ],
   "source": [
    "loss_vec = []\n",
    "test_loss = []\n",
    "for i in range(500):\n",
    "    rand_index = np.random.choice(len(x_vals_train), size=batch_size)\n",
    "    rand_x = x_vals_train[rand_index]\n",
    "    rand_y = np.transpose([y_vals_train[rand_index]])\n",
    "    sess.run(train_step, feed_dict={x_data: rand_x, y_target: rand_y})\n",
    "\n",
    "    temp_loss = sess.run(loss, feed_dict={x_data: rand_x, y_target: rand_y})\n",
    "    loss_vec.append(np.sqrt(temp_loss))\n",
    "\n",
    "    test_temp_loss = sess.run(loss, feed_dict={x_data: x_vals_test, y_target: np.transpose([y_vals_test])})\n",
    "    test_loss.append(np.sqrt(test_temp_loss))\n",
    "    if (i+1)%50==0:\n",
    "        print('Generation: ' + str(i+1) + '. Loss = ' + str(temp_loss))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n584772Tq1KnUq2eX1O7UqRNDhgzhv//972EPUCsJ9RQURYk6h1ujjxR16tRxv69atYpRo0Yxb948\nEhMTGTJkSNBR2DVq1HC/V6tWjfz8/COyoWHDhixZsoSvv/6a0aNH88knn/Daa68xdepUpk+fzhdf\nfMFTTz3F0qVLqVat2hFdy0uV8RR0hTlFUQ6H7Oxs4uPjSUhIYOvWrUydOrVcz9+jRw9+/PFHsrKy\nyM/PZ8KECZxzzjlkZmZijOGKK67g8ccfZ8GCBRQUFJCRkUGfPn14/vnnyczMZP/+/eVqT5XxFHJz\nc6NtgqIoRyFdu3alY8eOJCcn065dO84888wjOt+bb77Jxx8XLR2TlpbGk08+Sa9evTDG0L9/fy6+\n+GIWLFjA0KFDMcYgIjz77LPk5+dz9dVXk5OTQ2FhIffffz/x8fFHeot+HHVrNKempprDWWQnMzOT\nxo0bA+o1KEplYMWKFZx00knRNuOYJNizFZFfjDGpIQ5xqTLho3379kXbBEVRlEpPlRSFgoKCKFqi\nKIpSeamSonDfffdF0RJFUZTKS5UUhRdffJGDBw9G0RpFUZTKSZUUBbCjDxVFURR/VBQURVEUlyoj\nChdddBF/+9vf3O1t27aRnZ0dRYsURYkm5TF1NsC4cePYtm1b0LQhQ4bw+edH14KSVWbwWnx8PKec\ncoq73bNnT0DHLChKVSWcqbPDYdy4cXTt2pWmTZuWt4lRocp4CuA/N4miKEoo3nnnHU499VRSUlK4\n9dZbKSwsDDqV9YcffsiiRYsYNGhQ2B5GYWEh99xzD8nJyZx88snu6ObNmzdz1llnkZKSQnJyMrNn\nzw45fXYkqTKeAqgoKEqlplev4vsuuQSc2ntZ06dNOywzli5dymeffcbs2bOpXr06w4YNY8KECRx3\n3HHFprJOTEzkpZde4uWXXyYlJSWs83/00UesWLGCxYsXk5mZSffu3enZsyfvv/8+/fv35/7776eg\noIDc3Fx++eWXoNNnR5Iq5SlEYppZRVGOLb777jvmz59PamoqKSkpTJ8+nTVr1oScyrqszJw5k8GD\nB1OtWjWaNm3KWWedRVpaGt27d+eNN97g8ccfZ+nSpdStW7fcrlkW1FNQFKVyUFrN/kjTw8QYww03\n3MCTTz5ZLC3YVNblRZ8+fZg2bRpfffUV11xzDQ8++CDXXHNNRK8ZjCrlKagoKIpSGn379mXixIns\n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\ntsaxaNGioOdzwkfOXxEp9uMeMWIE33zzjbv9xhtvFDtPqB4zgXjDFl999RXt2rVj7dq1LFiwgNNP\nP519+/YhIhhjgnoK27Zto1UrOz3WwIF2VvW77rrLDbdNnz6dXr168Z///Cdog/369evp2bOnew7A\nLZj37dtHp06dMMbw5z//2U0P/LF98803nH/++e72jBkzgnp33sJv1KhRAJx22mmcccYZJCYmMmXK\nlKBrbeTl5fH++++Tnp7OmDFjirXjgBXMss7plZ+fX6yxfs6cOX4DHQPfB7CFVDA7SxKFzMxMNm7c\nyPTp01m1ahUjR450vZv169cXC0OWRGCPq2CiUFhYyNNPPw2UT6jNeeccIWjdujU5OTmH5amG4q67\n7mLatGl8//33vP/++37PZPr06YB9t0ojMzOTvn37MmLECO66665ys68sqKdQznhf8vr165coComJ\niW7+xo0b+6U5hWQgzzzzTMjlP4OFbYINaPPW1pwfn5cvv/zS/R7osXgJLGBPOOEEkpKS3Jrp77//\n7s5qG8xT8MbeHZzGWoB//OMfgPWSIHSYZdOmohnaly5d6n53ChRv+4LX5vz8fN5//32/czmCW1KB\n4bVj9uzZbntSsEbF/fv3u4V3cnJy0PM5glkWxo4d617XIbBtwam1On8htJcZGIrzvjenn346qamp\nPPHEE7z66qtMmDDBTQunoPMSKAoFBQXs3buX22+/nc2b7XyZwd6Lw22Uzs/Pd8/n3FNWVhaHDh3y\na+sqjU2bNtG3b9+Q/ytHVEeMGMHEiRP9eg46/6dq1aohInz//fchr7N+/XqMMYfd5lYeqCiUM15P\nISEhwW2ADUZiYqIb6gksMMJx+QOZNGkSo0ePdkWhoKCAt99+u1i+0n5g3oJ1+/btLFu2jB9//NHd\nN2rUKPr27cvNN9/sd1x8fDwpKSmum75v3z63Ft+/f38GDx7MhAkT3NCQ82P1FlQTJ050v8+cOROw\nce68vDy/wi0U3rEgDt62kcCQ1/LlfgsBsnHjRn744Qfi4uKYO3euGwf21qTDLUjAFt7O4MJA+59/\n/nmgeEFZWFjIrl27WLRoUciuu8EKjcDQjOMheM/v7QnmJVAEvZ6C053Z8TC8Nn366ad+3ZDXrVtX\nrNJSWFjI448/zs0331zMM83JyeGaa65hzJgxbmUkMAw2depUmjRpwrfffuvumzlzJtu2beP1118n\n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\nTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xcb05470>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(loss_vec, 'k-', label='Train Loss')\n",
    "plt.plot(test_loss, 'r--', label='Test Loss')\n",
    "plt.title('Loss (MSE) per Generation')\n",
    "plt.xlabel('Generation')\n",
    "plt.ylabel('Loss')\n",
    "plt.legend(loc='upper right')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
